/**
 * JWT 工具函数
 */

/**
 * 解码JWT payload (不验证签名)
 * @param token JWT token
 * @returns 解码后的payload或null
 */
export function decodeJwtPayload(token: string): any | null {
  try {
    const parts = token.split('.');
    if (parts.length !== 3) {
      return null;
    }

    // 解码payload (base64url)
    const payload = parts[1];
    if (!payload) {
      return null;
    }

    const decoded = atob(payload.replaceAll('-', '+').replaceAll('_', '/'));
    return JSON.parse(decoded);
  } catch (error) {
    console.error('Failed to decode JWT token:', error);
    return null;
  }
}

/**
 * 检查JWT token是否过期
 * @param token JWT token
 * @param bufferMinutes 提前多少分钟认为过期 (默认5分钟)
 * @returns true表示已过期或即将过期
 */
export function isJwtTokenExpired(
  token: string,
  bufferMinutes: number = 5,
): boolean {
  if (!token) {
    return true;
  }

  const payload = decodeJwtPayload(token);
  if (!payload || !payload.exp) {
    return true;
  }

  // exp是以秒为单位的时间戳
  const expirationTime = payload.exp * 1000;
  const currentTime = Date.now();
  const bufferTime = bufferMinutes * 60 * 1000;

  return currentTime >= expirationTime - bufferTime;
}

/**
 * 获取JWT token的剩余有效时间（毫秒）
 * @param token JWT token
 * @returns 剩余时间（毫秒），如果token无效则返回0
 */
export function getJwtTokenRemainingTime(token?: null | string): number {
  if (!token) {
    return 0;
  }

  const payload = decodeJwtPayload(token);
  if (!payload || !payload.exp) {
    return 0;
  }

  const expirationTime = payload.exp * 1000;
  const currentTime = Date.now();
  const remainingTime = expirationTime - currentTime;

  return Math.max(0, remainingTime);
}
